Mean Encoding

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.09.01
조회수
5
버전
v1

Mean Encoding

** Encoding(평균코딩)은 범주형 변수(Categorical Variable)를 수치형 변수로 변환하는 고 인코딩 기법 중로, 주로 지도 학습**(Supervised Learning)에서 회귀 또는 분류 문제에 활용됩니다. 이 방법은 범주형 변수의 각 범주(Category)를 그 범주에 해당하는 타겟 변수(Target Variable)의 평균값으로 대체하는 방식으로 작동합니다. Mean Encoding은 특히 고유한 카테고리가 많은 변수(예: 도시명, 제품 코드 등)에서 효과적으로 정보를 압축하고 모델 성능을 향상시킬 수 있습니다.


개요

범주형 변수는 머신러닝 모델이 직접 처리할 수 없기 때문에 인코딩을 통해 수치형으로 변환해야 합니다. 일반적인 방법으로는 원-핫 인코딩(One-Hot Encoding), 레이블 인코딩(Label Encoding) 등이 있지만, 카테고리 수가 많을 경우 차원 증가 또는 정보 손실 문제가 발생할 수 있습니다. Mean Encoding은 이러한 한계를 보완하기 위해 제안된 기법으로, 타겟 변수와의 관계를 반영한 인코딩을 가능하게 합니다.

예를 들어, "도시"라는 범주형 변수가 있고, 타겟이 "매출액"이라면, 각 도시별 평균 매출액을 해당 도시의 수치로 대체하게 됩니다. 이는 모델이 범주와 타겟 간의 관계를 학습하는 데 유리하게 작용합니다.


작동 원리

Mean Encoding은 다음 단계로 수행됩니다:

  1. 데이터 분할: 훈련 데이터를 기반으로 인코딩을 수행합니다. 일반적으로 과적합을 방지하기 위해 교차 검증(CV) 기반 인코딩 또는 폴드별 인코딩을 사용합니다.
  2. 타겟 평균 계산: 각 범주에 속한 샘플들의 타겟 변수 값의 평균을 계산합니다.
  3. 변환 적용: 범주형 값을 해당 평균값으로 대체합니다.

수식 표현

범주 ( c )에 대해 Mean Encoding 값은 다음과 같이 정의됩니다:

[ \text{MeanEncoding}(c) = \frac{\sum_{i \in C_c} y_i}{|C_c|} ]

여기서: - ( C_c ): 범주 ( c )에 속한 샘플의 집합 - ( y_i ): 샘플 ( i )의 타겟 값 - ( |C_c| ): 범주 ( c )에 속한 샘플 수

점과 단점

✅ 장점

  • 정보 효율성: 범주와 타겟 간의 관계를 직접 반영하므로 모델이 학습하기 쉬운 형태의 피처를 제공합니다.
  • 차원 축소: 원-핫 인코딩처럼 차원이 급격히 증가하지 않아 메모리 사용이 효율적입니다.
  • 고유 카테고리 많은 변수에 적합: 예: 사용자 ID, 지역 코드 등에서 유용하게 사용됩니다.

❌ 단점

  • 과적합 위험: 훈련 데이터에만 존재하는 편향된 평균을 사용하면 테스트 데이터에서 성능 저하가 발생할 수 있습니다.
  • 데이터 누수(Data Leakage): 전체 훈련 데이터의 평균을 사용하면 타겟 정보가 인코딩 과정에 직접 노출되어 과적합의 원인이 됩니다.
  • 희소 범주 문제: 범주 내 샘플 수가 매우 적을 경우 평균이 불안정해질 수 있습니다.

과적합 방지를 위한 기법

Mean Encoding은 과적합에 취약하므로, 이를 완화하기 위한 여러 전략이 존재합니다.

1. K-Fold 평균 인코딩

훈련 데이터를 K개의 폴드로 나누고, 각 폴드에서 다른 폴드의 데이터를 사용해 평균을 계산합니다. 이렇게 하면 동일한 데이터에서 타겟 정보를 반복 사용하는 것을 방지할 수 있습니다.

from sklearn.model_selection import KFold
import pandas as pd
import numpy as np

def kfold_mean_encoding(train_df, test_df, cat_cols, target_col, n_splits=5):
    kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)
    train_encoded = train_df.copy()
    test_encoded = test_df.copy()
    
    for col in cat_cols:
        # 테스트 데이터: 전체 훈련 데이터 기준 평균
        global_mean = train_df[target_col].mean()
        temp_encoded = train_df.groupby(col)[target_col].mean()
        
        test_encoded[col + '_mean'] = test_df[col].map(temp_encoded).fillna(global_mean)
        
        # 훈련 데이터: K-Fold 방식으로 누수 방지
        train_encoded[col + '_mean'] = 0
        for train_idx, val_idx in kf.split(train_df):
            X_tr, X_val = train_df.iloc[train_idx], train_df.iloc[val_idx]
            temp_map = X_tr.groupby(col)[target_col].mean()
            train_encoded.loc[val_idx, col + '_mean'] = X_val[col].map(temp_map).fillna(global_mean)
    
    return train_encoded, test_encoded

2. Smoothing (스무딩)

희소 범주에 대해 평균이 불안정해지는 문제를 해결하기 위해 전체 평균을 가중 평균으로 포함시킵니다.

[ \text{SmoothedMean}(c) = \frac{(\text{count}(c) \times \text{mean}(c)) + (\text{global_mean} \times m)}{\text{count}(c) + m} ]

  • ( m ): 스무딩 강도 (하이퍼파라미터, 일반적으로 50~100 사용)

이 방식은 샘플 수가 적은 범주는 전체 평균에 가깝게 조정되어 안정성을 높입니다.


활용 사례

  • 이커머스: 제품 카테고리별 평균 구매 확률 인코딩
  • 금융: 고객 지역별 대출 상환률 인코딩
  • 광고 추천: 사용자 클릭률 기반 지역 인코딩

관련 인코딩 기법

기법 설명 비고
Target Encoding Mean Encoding의 일반화된 형태로, 회귀에서는 평균, 분류에서는 확률 사용 Mean Encoding과 동의어로 사용됨
Leave-One-Out Encoding 각 샘플을 제외한 나머지 데이터로 평균 계산 누수 최소화
Weight of Evidence Encoding 범주별 로그 오즈비 사용 이진 분류에 특화
CatBoost Encoding CatBoost에서 제안된 동적 인코딩 방식 내부적으로 과적합 방지 기능 포함

참고 자료

Mean Encoding은 적절한 정규화와 교차 검증을 통해 강력한 피처 엔지니어링 도구가 될 수 있으며, 특히 고차원 범주형 데이터를 다룰 때 매우 유용합니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?